package com.cmes.core.utils.dict;

import com.cmes.core.utils.StringPool;
import com.cmes.core.utils.StringUtils;

import java.math.BigDecimal;
import java.util.Objects;

/**
 * 字典类
 *
 * @author Bruce.Gong
 * @since 1.0.0-SNAPSHOT
 */
public interface Dict<T> {

    /**
     * 获取字典键
     *
     * @return 键名
     */
    T getCode();

    /**
     * 获取字典值
     *
     * @return 值
     */
    String getValue();

    /**
     * 键是否匹配
     *
     * @param code 字典键
     * @return true | false
     */
    default boolean match(T code) {
        return code != null && Objects.equals(code, getCode());
    }

    /**
     * 值是否匹配
     *
     * @param item 字典
     * @return true | false
     */
    default boolean match(Dict<T> item) {
        return item == this;
    }

    /**
     * 值是否匹配
     *
     * @param stringCode 字符串字典
     * @return true | false
     */
    default boolean matchString(String stringCode) {
        return StringUtils.isNotBlank(stringCode) && Objects.equals(stringCode, getCode().toString());
    }

    /**
     * 值是否匹配
     *
     * @param code 字典键
     * @return true | false
     */
    default boolean matchObject(Object code) {
        if (code == null || StringPool.EMPTY.equals(code)) {
            return false;
        }
        if (NumberDict.class.isAssignableFrom(this.getClass())) {
            String sCodeStr = getCode().toString();
            String tCodeStr = code.toString();
            return new BigDecimal(sCodeStr).compareTo(new BigDecimal(tCodeStr)) == 0;
        }
        return Objects.equals(code.toString(), getCode().toString());
    }

}
